#ifndef BAIDUPINYINAPI_H
#define BAIDUPINYINAPI_H

#include <QObject>
#include <QNetworkAccessManager>
#include <QMap>
#include <QMutex>
#include <QJsonDocument>

class NetworkManager;

class BaiduPinyinApi : public QObject
{
	Q_OBJECT
	Q_DISABLE_COPY_MOVE(BaiduPinyinApi) // 禁止拷贝移动
	friend class NetworkManager;

public:
	// error API错误码
	enum class ApiErrorCode {
        Success,        // 成功
        AppIdError,     // AppID错误/未配置
        SecretKeyError, // SecretKey错误
        NetworkError,   // 网络超时/连接失败
        QuotaExceed,    // API配额用尽
        LengthExceed,   // 文本长度超限制
        JsonParseError  // 响应JSON解析失败
    };

	// 单例接口
	static BaiduPinyinApi* getInstance(QObject* parent = nullptr);
	~BaiduPinyinApi() override;

	// func
	void convertToPinyin(const QString& text);
	void testApiConfig(const QString& appId, const QString& secretKey);

	// cache
	void clearPinyinCache();
    int getCacheHitRate() const;  // 获取缓存命中率

signals:
    void conversionSuccess(const QString& text, const QString& pinyin);
    void conversionFailed(ApiErrorCode code, const QString& msg);
    void testResult(bool isValid, const QString& msg);

public slots:
	void updateApiconfig(const QString& appId, const QString& secretKey);

private:
	explicit BaiduPinyinApi(QObject* parent = nullptr);

	// tools  helpers 
	QString generateSign(const QString& appId, const QString& text, const QString& salt, const QString& secretKey);  // 生成API签名
    bool splitLongText(const QString& text, QStringList& parts);  // 长文本拆分（单段≤200字符）
    QString getPinyinFromCache(const QString& text);  // 从缓存获取拼音（内存→本地）
    void savePinyinToCache(const QString& text, const QString& pinyin);  // 保存到缓存
    void loadLocalCache();  // 加载本地缓存（含离线多音字库）
    void saveLocalCache();  // 保存本地缓存到文件
    QString parseApiResponse(const QByteArray& response, ApiErrorCode& code);  // 解析API响应

private:
	static BaiduPinyinApi* m_instance;
	static QMutex m_instanceMutex;

	NetworkManager* m_networkMgr;    // 网络管理器
	// API info
	QString m_appId;
	QString m_secretKey;

	// double cache
	QMap<QString, QString> m_memoryCache;   // 多音字缓存 原文->拼音
	QJsonDocument m_localCacheDoc;         // 本地缓存文件内容
	const QString m_localCachePath = "dictionary/dict_files/pinyin_base_dict.json";  // 本地缓存路径
	// cnt info
	int m_totalRequest = 0;    // 总请求数
	int m_cacheHit = 0;        // 缓存命中数

	// API params
	const QString m_apiUrl = "https://fanyi-api.baidu.com/api/trans/vip/translate";
    const int m_maxTextLength = 200;  // API单段文本限制

};


#endif // BAIDUPINYINAPI_H